Control LED Brightness with XIAO RP2040 & OLED Display | Push Button Tutorial

Image

In this project, you will learn how to control the brightness of an LED using two push buttons and display the brightness level as a percentage on an OLED display. We will use the XIAO RP2040 microcontroller, which is compact but powerful, making it perfect for projects like this. The LED brightness will be adjusted incrementally with one button to increase and another to decrease, providing real-time feedback on the OLED display.

This tutorial is ideal for anyone looking to practice using OLED displays, PWM (Pulse Width Modulation) for LED control, and handling user inputs like push buttons with debouncing logic.

Components Used

XIAO RP2040

Image

OLED Display (I2C)

Image

Red Push Button & Blue Push Button

Image

100 Ohm Resistor and Blue LED

Image

XIAO RP2040 Overview

The Seeed Studio XIAO RP2040 is a compact yet powerful development board featuring a dual-core RP2040 processor, capable of operating at up to 133 MHz. This board, measuring just 21x17.8mm, includes 264KB of SRAM and 2MB of onboard flash, which offers substantial storage and processing capacity. It supports various interfaces including I2C, UART, SPI, and includes 14 GPIO pins, making it ideal for a wide variety of compact projects.

Pinout of XIAO RP2040

Image

Circuit Connections

OLED Display (I2C)

Schematic

Image

Code Breakdown

Code Overview

The code controls the brightness of an LED using two push buttons. The brightness level is displayed on an OLED screen. The red button increases the brightness, and the blue button decreases it. The OLED shows the current brightness percentage.

Code Explanation

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>



const int buttonPin1 = D7;  // Push button 1 (Red)

const int buttonPin2 = D8;  // Push button 2 (Blue)

int brightness = 0;         // Initial brightness level

const int ledPin = 4;       // LED pin for PWM control



unsigned long previousMillis1 = 0;  // Last time button 1 was pressed

unsigned long previousMillis2 = 0;  // Last time button 2 was pressed

const long debounceDelay = 200;     // Debounce delay for button presses



// OLED display dimensions

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64



Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT);

Libraries: We include Wire.h, Adafruit_GFX.h, and Adafruit_SSD1306.h to manage the OLED display and I2C communication.

Pin Definitions: Button pins (D7, D8) are for push buttons. The LED is connected to pin 4, a PWM-enabled pin.

Debouncing: We set a debounce delay (200 ms) to avoid multiple triggers when a button is pressed.

void setup() {

  pinMode(buttonPin1, INPUT_PULLUP);  // Set button pins as inputs

  pinMode(buttonPin2, INPUT_PULLUP);

  pinMode(ledPin, OUTPUT);            // Set LED pin as output



  Serial.begin(9600);                 // Initialize serial communication



  // Initialize OLED display with I2C address 0x3C

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

    Serial.println(F("SSD1306 allocation failed"));

    for (;;); // Infinite loop if OLED fails

  }



  display.clearDisplay();              // Clear the display at startup

  display.setTextSize(1);              // Set text size

  display.setTextColor(SSD1306_WHITE); // White text

  display.setCursor(0, 0);             // Start at top-left corner

  display.display();                   // Display the initial setup

}

Pin Modes: Push buttons are set up as input with pull-up resistors. The LED pin is set as an output.

OLED Initialization: If the OLED display doesn’t initialize, the program will stop, showing an error message.

Display Setup: The OLED is cleared, and text settings are prepared for updates.

void loop() {

  unsigned long currentMillis = millis();  // Get the current time



  // Increase brightness when the red button is pressed

  if (currentMillis - previousMillis1 >= debounceDelay) {

    if (digitalRead(buttonPin1) == LOW) {

      previousMillis1 = currentMillis;    // Update last press time

      brightness += 15;                   // Increase brightness

      if (brightness > 255) brightness = 255;  // Cap brightness at 255

      analogWrite(ledPin, brightness);    // Apply brightness to LED

      updateOLED(brightness);             // Update OLED with brightness

    }

  }



  // Decrease brightness when the blue button is pressed

  if (currentMillis - previousMillis2 >= debounceDelay) {

    if (digitalRead(buttonPin2) == LOW) {

      previousMillis2 = currentMillis;    // Update last press time

      brightness -= 15;                   // Decrease brightness

      if (brightness < 0) brightness = 0;  // Cap brightness at 0

      analogWrite(ledPin, brightness);    // Apply brightness to LED

      updateOLED(brightness);             // Update OLED with brightness

    }

  }

}

Button Actions: Each button press increases or decreases the LED brightness in steps of 15. The OLED is updated after each change.

Debouncing: We check that the debounce delay has passed before registering a button press.

// Function to update OLED display with brightness percentage

void updateOLED(int brightnessValue) {

  display.clearDisplay();  // Clear OLED display

  display.setCursor(0, 0); // Set cursor to top-left

  display.setTextSize(2);  // Increase text size

  display.print("Brightness ");



  // Convert brightness (0-255) to percentage

  int brightnessPercentage = map(brightnessValue, 0, 255, 0, 100);

  display.setCursor(35, 30); // Position text

  display.print(brightnessPercentage);

  display.print("%");



  display.display();  // Output text to the display

}

OLED Update Function: This function clears the display and shows the current brightness as a percentage. The percentage is calculated by mapping the brightness (0-255) to a 0-100% scale.

Full Code

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>



const int buttonPin1 = D7;

const int buttonPin2 = D8;

int brightness = 0;

const int ledPin = 4;



unsigned long previousMillis1 = 0;

unsigned long previousMillis2 = 0;

const long debounceDelay = 200;



#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT);



void setup() {

  pinMode(buttonPin1, INPUT_PULLUP);

  pinMode(buttonPin2, INPUT_PULLUP);

  pinMode(ledPin, OUTPUT);



  Serial.begin(9600);



  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

    Serial.println(F("SSD1306 allocation failed"));

    for (;;);

  }



  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0, 0);

  display.display();

}



void loop() {

  unsigned long currentMillis = millis();



  if (currentMillis - previousMillis1 >= debounceDelay) {

    if (digitalRead(buttonPin1) == LOW) {

      previousMillis1 = currentMillis;

      brightness += 15;

      if (brightness > 255) brightness = 255;

      analogWrite(ledPin, brightness);

      updateOLED(brightness);

    }

  }



  if (currentMillis - previousMillis2 >= debounceDelay) {

    if (digitalRead(buttonPin2) == LOW) {

      previousMillis2 = currentMillis;

      brightness -= 15;

      if (brightness < 0) brightness = 0;

      analogWrite(ledPin, brightness);

      updateOLED(brightness);

    }

  }

}



void updateOLED(int brightnessValue) {

  display.clearDisplay();

  display.setCursor(0, 0);

  display.setTextSize(2);

  display.print("Brightness ");

  

  int brightnessPercentage = map(brightnessValue, 0, 255, 0, 100);

  display.setCursor(35, 30);

  display.print(brightnessPercentage);

  display.print("%");



  display.display();

}

How the Project Works

In this project, two push buttons control the brightness of an LED. The red push button increases the brightness, while the blue one decreases it. The current brightness is shown as a percentage on an OLED display.

poster_article ARDUINO CODE FOR: Water Level Measurement with Audio | ...
poster_article Upload Ideas T-shirt Oversize